#include <iostream>
#include <jsoncpp/json/json.h>
#include <string>
#include <memory>
#include <sstream>
bool Serialize(const Json::Value val, std::string &out) // json序列化
{
    // 实例化一个StreamWriterBuilder工厂类对象
    Json::StreamWriterBuilder swb;
    // 通过StreamWriterBuilder工厂类对象来生成StreamWriter类对象
    std::unique_ptr<Json::StreamWriter> sw(swb.newStreamWriter());

    // 创建字符串流对象，存储对val中数据序列化的结果
    std::stringstream ss;
    // 使用StreamWriter对象对val中的数据进行序列数
    int n = sw->write(val, &ss);
    if (n != 0)
    {
        std::cout << "Json Serialize failed!" << std::endl;
        return false;
    }
    out = ss.str();
    return true;
}

bool UnSerialize(std::string& str,Json::Value&val)//json反序列化
{
    // 实例化一个CharReaderBuilder工厂类对象
    Json::CharReaderBuilder crb;
    // 通过CharReaderBuilder工厂类对象来生成CharReader类对象
    std::unique_ptr<Json::CharReader> cr(crb.newCharReader());

    std::string err;//保存错误信息
    // 使用CharReader对象对str中的数据进行反序列化
    bool ret=cr->parse(str.c_str(),str.c_str()+str.size(),&val,&err);
    if(!ret)
    {
        std::cout<<"Json UnSerialize failed : "<<err<<std::endl;
    }
    return ret;
}

int main()
{
    Json::Value stu;
    stu["姓名"] = "张三";
    stu["年龄"] = 19;
    stu["成绩"].append(77.5);
    stu["成绩"].append(88);
    stu["成绩"].append(99.5);
    Json::Value fav;
    fav["书籍"] = "西游记";
    fav["运动"] = "游泳";
    stu["爱好"] = fav;

    std::string ser;
    if(Serialize(stu,ser))
    {
        std::cout<<ser<<std::endl;
    }
    if(!stu["书籍"].isNull())
    {
        std::cout<<"爱好：书籍："<<stu["爱好"]["书籍"].asString()<<std::endl;
    }

    Json::Value unser;
    std::string str2=R"({"姓名":"李四","年龄":20,"成绩":[28.9,19.6,35]})"; //R"(xxx...)"：不对xxx...字符串做任何转义，是什么样，输出还是什么样
    if(UnSerialize(str2,unser))
    {
        std::cout<<"姓名："<<unser["姓名"].asString()<<std::endl;
        std::cout<<"年龄："<<unser["年龄"].asInt()<<std::endl;
        int sz=unser["成绩"].size();
        std::cout<<"成绩：[";
        int i=0;
        for(i=0;i<sz-1;i++)
        {
            std::cout<<unser["成绩"][i].asFloat()<<",";
        }
        std::cout<<unser["成绩"][i].asFloat()<<"]"<<std::endl;
    }

    return 0;
}